home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1996 / MacHack 1996.toast / Hacks / Hacks ’87 / Source ƒ.sit / Source ƒ / C ƒ / CITADEL BBS 'C' SRC / LIBARCH.C < prev    next >
C/C++ Source or Header  |  1987-01-14  |  6KB  |  228 lines

  1. /************************************************************************/
  2. /*                libarch.c                */
  3. /*    Archive handling for Citadel bulletin board system        */
  4. /************************************************************************/
  5.  
  6. /************************************************************************/
  7. /*                history                 */
  8. /*                                    */
  9. /* 86Aug01 HAW    Created.                        */
  10. /************************************************************************/
  11.  
  12. #include <ctdl.h>
  13.  
  14. /************************************************************************/
  15. /*                contents                */
  16. /*                                    */
  17. /*    addArchiveList()    add new archive to room archive list    */
  18. /*    addToList()        common for addAr.. and initArch...    */
  19. /*    findArchiveName()    gets requested archive name        */
  20. /*    initArchiveList()    eat archive list            */
  21. /************************************************************************/
  22.  
  23. struct any_list {
  24.     int         roomNo;
  25.     char        *archName;
  26.     struct any_list *next;
  27. } Arch_base, Bad_base;
  28.  
  29. char *ArchFileName = "a:ctdlarch.sys";
  30. char *ProbFileName = "a:ctdlbad.sys";
  31.  
  32. extern struct config cfg;
  33.  
  34. FILE *safeopen();
  35. /************************************************************************/
  36. /*    findArchiveName() gets archive name for given room        */
  37. /************************************************************************/
  38. char *findArchiveName(i)
  39. int i;
  40. {
  41.     struct any_list *rover;
  42.  
  43.     for (rover = Arch_base.next; rover != NULL; rover = rover->next) {
  44.     if (rover->roomNo == i)
  45.         return rover->archName;
  46.     }
  47.     return NULL;
  48. }
  49.  
  50. /************************************************************************/
  51. /*    initArchiveList() set up archive list                */
  52. /************************************************************************/
  53. initArchiveList()
  54. {
  55.     struct any_list *rover;
  56.     char name[120], *fgets(), *malloc(), *runner, *b;
  57.     label filename;
  58.     int room;
  59.  
  60.     strCpy(filename, ArchFileName);
  61.     filename[0] += cfg.homeDisk;
  62.     initList(filename, &Arch_base);
  63.     for (rover = Arch_base.next; rover != NULL; rover = rover->next) {
  64.     rover->roomNo = atoi(rover->archName);
  65.     for (runner = rover->archName; isdigit(*runner); runner++)
  66.         ;
  67.     runner++;    /* Just over space */
  68.     b = malloc(strLen(runner) + 1);
  69.     strCpy(b, runner);
  70.     free(rover->archName);
  71.     rover->archName = b;
  72.     }
  73. }
  74.  
  75. /************************************************************************/
  76. /*    initList() set up list                        */
  77. /************************************************************************/
  78. initList(fileName, base)
  79. char *fileName;
  80. struct any_list *base;
  81. {
  82.     FILE *fd, *safeopen();
  83.     char name[120], *fgets();
  84.     int room;
  85.  
  86.     base->next = NULL;
  87.  
  88.     if ((fd = safeopen(fileName, "r")) == NULL)
  89.     return FALSE;
  90.  
  91.     room = 0;
  92.     while (fgets(name, 118, fd) != NULL) {
  93.     name[strLen(name) - 1] = 0;    /* Kill off excess newline */
  94.     addToList(base, room++, name);
  95.     }
  96.  
  97.     fclose(fd);
  98.     return TRUE;
  99. }
  100.  
  101. /************************************************************************/
  102. /*    addArchiveList() add to archive list                */
  103. /************************************************************************/
  104. addArchiveList(room, fn)
  105. int room;
  106. char *fn;
  107. {
  108.     FILE  *fd;
  109.     struct any_list *rover;
  110.     char  *format = "%d %s\n";
  111.     char  replace;
  112.     label filename;
  113.  
  114.     strCpy(filename, ArchFileName);
  115.     filename[0] += cfg.homeDisk;
  116.  
  117.     replace = addToList(room, fn);
  118.  
  119.     if ((fd = safeopen(filename, replace ? "w" : "a")) == NULL) {
  120.     mPrintf("?Couldn't open %s!\n ", filename);
  121.     return FALSE;
  122.     }
  123.  
  124.     if (replace) {
  125.     for (rover = Arch_base.next; rover != NULL; rover = rover->next)
  126.         fprintf(fd, format, rover->roomNo, rover->archName);
  127.     }
  128.     else {
  129.     fprintf(fd, format, room, fn);
  130.     }
  131.  
  132.     fclose(fd);
  133.  
  134.     return TRUE;
  135. }
  136.  
  137. /************************************************************************/
  138. /*    addToList() Adds filename to archive list            */
  139. /************************************************************************/
  140. static int addToList(base, room, fn)
  141. struct any_list *base;
  142. int room;
  143. char *fn;
  144. {
  145.     struct any_list *rover;
  146.     char found;
  147.  
  148.     for (rover = base, found = FALSE; rover->next != NULL;
  149.                              rover = rover->next)
  150.     if (rover->next->roomNo == room) {
  151.         found = TRUE;
  152.         break;
  153.     }
  154.  
  155.     if (!found) {
  156.     rover->next = (struct any_list *) malloc(sizeof Arch_base);
  157.     rover = rover->next;
  158.     rover->next = NULL;
  159.     }
  160.     else {
  161.     rover = rover->next;
  162.     free(rover->archName);
  163.     }
  164.  
  165.     rover->roomNo = room;
  166.     rover->archName = malloc(strLen(fn) + 1);
  167.     strCpy(rover->archName, fn);
  168.  
  169.     return found;
  170. }
  171.  
  172. /************************************************************************/
  173. /*    initBadList() read in list of bad filenames            */
  174. /************************************************************************/
  175. initBadList()
  176. {
  177.     char filename[30];
  178.  
  179.     strCpy(filename, ProbFileName);
  180.     filename[0] += cfg.homeDisk;
  181.     if (!initList(filename, &Bad_base)) {
  182.     printf("WARNING: Bad filename file ('%s') is missing!\n", filename);
  183.     }
  184. }
  185.  
  186. /************************************************************************/
  187. /*    srchBadList() search for given filename in list         */
  188. /************************************************************************/
  189. srchBadList(fn)
  190. char *fn;
  191. {
  192.     char *start, *temp, *strchr(), *strrchr();
  193.     struct any_list *rover;
  194.     label buf;
  195.  
  196.     if (strLen(fn) > 8) return FALSE;
  197.     strCpy(buf, fn);
  198.     if ((start = strrchr(buf, '\\')) == NULL) {
  199.     if ((start = strchr(buf, ':')) == NULL) {
  200.         start = buf;
  201.     }
  202.     else
  203.         start++;
  204.     }
  205.     else
  206.     start++;
  207.     if ((temp = strchr(start, '.')) != NULL) *temp = 0;
  208.     for (rover = Bad_base.next; rover != NULL; rover=rover->next) {
  209.     if (strCmpU(rover->archName, start) == 0) return TRUE;
  210.     }
  211.     return FALSE;
  212. }
  213.  
  214. /************************************************************************/
  215. /*    safeopen() Handles DOS bug problem                */
  216. /************************************************************************/
  217. FILE *safeopen(fn, mode)
  218. char *fn;
  219. char *mode;
  220. {
  221.     FILE *fopen();
  222.  
  223.     if (srchBadList(fn))
  224.     return NULL;
  225.  
  226.     return fopen(fn, mode);
  227. }
  228.